home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / PowerMacOberon feb96 / Source / Clipboard.Mod (.txt) < prev    next >
Oberon Text  |  1995-05-04  |  4KB  |  119 lines

  1. Syntax10.Scn.Fnt
  2. StampElems
  3. Alloc
  4. 4 May 95
  5. ParcElems
  6. Alloc
  7. Syntax10i.Scn.Fnt
  8. MODULE Clipboard;    (** mf / mah 29.8.94 (
  9.     IMPORT Kernel, Texts, TextFrames, Macintosh, Oberon, MenuViewers, Viewers, Fonts;
  10.     TYPE
  11.         Scrap=POINTER TO ScrapDesc;
  12.         ScrapDesc=RECORD (Texts.TextDesc)    (* extension of standard TextDesc in order to keep track of changes *)
  13.             changed: BOOLEAN
  14.         END;
  15.         scrap: Scrap; ClipB: Texts.Buffer; M: Oberon.CopyOverMsg; W: Texts.Writer;
  16.     PROCEDURE ConvertCharFromOberon (VAR ch: CHAR);
  17.     BEGIN
  18.         CASE ch OF
  19. ':    ch := CHR (138)
  20.         |    '
  21. ':    ch := CHR (154)
  22.         |    '
  23. ':    ch := CHR (159)
  24. (*    |    '
  25. ':    ch := CHR (128) *)
  26.         |    '
  27. ':    ch := CHR (133)
  28.         |    '
  29. ':    ch := CHR (134)
  30.         ELSE
  31.         END
  32.     END ConvertCharFromOberon;
  33.     PROCEDURE ConvertCharToOberon (VAR ch: CHAR);
  34.     BEGIN
  35.         CASE ORD (ch) OF
  36.             138:    ch := '
  37.         |    154:    ch := '
  38.         |    159:    ch := '
  39. (*    |    128:    ch := '
  40.         |    133:    ch := '
  41.         |    134:    ch := '
  42.         ELSE
  43.         END
  44.     END ConvertCharToOberon;
  45.     PROCEDURE Cut*;
  46.     VAR t: Texts.Text; beg, end, time: LONGINT;
  47.     BEGIN
  48.         Texts.Delete (scrap, 0, scrap.len);
  49.         Oberon.GetSelection (t, beg, end, time);
  50.         IF time >= 0 THEN Texts.Save (t, beg, end, ClipB); Texts.Delete (t, beg, end); Texts.Append (scrap, ClipB) END;
  51.     END Cut;
  52.     PROCEDURE Copy*;
  53.     VAR t: Texts.Text; beg, end, time: LONGINT;
  54.     BEGIN
  55.         Texts.Delete (scrap, 0, scrap.len);
  56.         Oberon.GetSelection (t, beg, end, time);
  57.         IF time >= 0 THEN Texts.Save(t, beg, end, ClipB); Texts.Append(scrap, ClipB) END
  58.     END Copy;
  59.     PROCEDURE Paste*;
  60.     BEGIN
  61.         IF scrap.len > 0 THEN
  62.             M.text:=scrap; M.beg:=0; M.end:=scrap.len;
  63.             Oberon.FocusViewer.handle (Oberon.FocusViewer, M)
  64.         END
  65.     END Paste;
  66.     PROCEDURE Show*;
  67.     VAR V: Viewers.Viewer; X, Y: INTEGER;
  68.     BEGIN
  69.         Oberon.AllocateUserViewer (Oberon.Par.vwr.X, X, Y);
  70.         V:=MenuViewers.New (TextFrames.NewMenu ("Clipboard", "^Edit.Menu.Text"),
  71.                                         TextFrames.NewText (scrap, 0), TextFrames.menuH, X, Y)
  72.     END Show;
  73.     PROCEDURE* Import;
  74.     VAR run: ARRAY 1024 OF CHAR; i, len: INTEGER; fname: ARRAY 32 OF CHAR;
  75.     BEGIN
  76.         IF Macintosh.convertClip THEN
  77.             Texts.Delete (scrap, 0, scrap.len);
  78.             Macintosh.GetScrap; Macintosh.GetRun (run, len, fname);
  79.             WHILE len > 0 DO
  80.                 Texts.SetFont (W, Fonts.This (fname)); i:=0;
  81.                 WHILE i < len DO
  82.                     ConvertCharToOberon (run[i]);
  83.                     Texts.Write (W, run[i]);
  84.                     INC (i)
  85.                 END;
  86.                 Macintosh.GetRun (run, len, fname)
  87.             END;
  88.             Texts.Append (scrap, W.buf); scrap.changed:=FALSE
  89.         END
  90.     END Import;
  91.     PROCEDURE* Export;
  92.     VAR R: Texts.Reader; run: ARRAY 1024 OF CHAR; ch: CHAR; len: INTEGER; fnt: Fonts.Font;
  93.     BEGIN
  94.         IF Macintosh.convertClip & scrap.changed THEN 
  95.             Texts.OpenReader (R, scrap, 0); Texts.Read (R, ch);
  96.             WHILE ~R.eot DO
  97.                 run[0]:=ch; fnt:=R.fnt; len:=1; Texts.Read (R, ch);
  98.                 WHILE (~R.eot) & (R.fnt=fnt) & (len < 1024) DO
  99.                     ConvertCharFromOberon (ch); run[len]:=ch;
  100.                     Texts.Read (R, ch); INC (len)
  101.                 END;
  102.                 Macintosh.PutRun (run, len, fnt.name)
  103.             END;
  104.             Macintosh.PutScrap; scrap.changed:=FALSE
  105.         END
  106.     END Export;
  107.     PROCEDURE* Notify (T: Texts.Text; op: INTEGER; beg, end: LONGINT);
  108.     BEGIN
  109.         T(Scrap).changed:=TRUE;
  110.         TextFrames.NotifyDisplay (T, op, beg, end)
  111.     END Notify;
  112. BEGIN
  113.     Texts.OpenWriter (W); NEW (ClipB); Texts.OpenBuf (ClipB);
  114.     NEW (scrap); scrap.notify:=Notify; Texts.Open (scrap, "");
  115.     Macintosh.suspendQ.Add  (Export); Kernel.quitQ.Add (Export);
  116.     Macintosh.resumeQ.Add (Import);
  117.     Macintosh.convertClip:=TRUE; Import
  118. END Clipboard.
  119.